/*OLED数据显示*/
#pragma once
#include <U8g2lib.h>

U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /*clock=*/SCL, /*data=*/SDA, /*reset=*/U8X8_PIN_NONE);

void dataDisplay(); // 数据显示

typedef struct
{
    float temp;
    float Solar_V;
    float Solar_I;
    float Solar_P;
    float Charge_V;
    float Charge_I;
    float Charge_P;
} OLED;
OLED oled = {0};

void oledTask(void *pt)
{
    u8g2.begin();
    u8g2.setFont(u8g2_font_7x13_tr);
    u8g2.setContrast(60);                // 设置屏幕亮度
    SensorData *data = (SensorData *)pt; // 数据解耦
    while (1)
    {
        if (xSemaphoreTake(xMutexSensor, timeOut) == pdPASS)
        {
            oled.temp = data->tempC; // PCB温度
            oled.Solar_V = data->Solar_V;
            oled.Solar_I = data->Solar_I;
            oled.Solar_P = data->Solar_P;

            oled.Charge_V = data->Charge_V;
            oled.Charge_I = data->Charge_I;
            oled.Charge_P = data->Charge_P;
            xSemaphoreGive(xMutexSensor); // 释放钥匙
        }
        else
        {
            // Unable to obtain MUTEX
        }
        dataDisplay();
        vTaskDelay(500);
    }
}

void dataDisplay()
{
    u8g2.clearBuffer();

    u8g2.drawVLine(40, 0, 64); // 画一条竖线
    u8g2.drawVLine(88, 0, 64);

    u8g2.drawHLine(0, 14, 128); // 画一条水平线
    u8g2.drawHLine(0, 31, 128);
    u8g2.drawHLine(0, 49, 128);

    // 光伏电池输出参数
    u8g2.setDrawColor(2); // 设置颜色,0透显,1实显,2XOR
    u8g2.drawBox(0, 0, 36, 12);
    u8g2.setDrawColor(0); //
    u8g2.drawStr(1, 9, "Solar");
    u8g2.setDrawColor(1); //
    // u8g2.drawStr(0, 28, "18.5V");
    // u8g2.drawStr(0, 46, "1.2A");
    // u8g2.drawStr(0, 63, "12.5W");
    u8g2.setCursor(0, 28);
    u8g2.print(oled.Solar_V, 1);
    u8g2.print("V");
    u8g2.setCursor(0, 46);
    u8g2.print(oled.Solar_I, 1);
    u8g2.print("A");
    u8g2.setCursor(0, 63);
    u8g2.print(oled.Solar_P, 1);
    u8g2.print("W");
    // u8g2.sendBuffer();

    // 电池充电参数
    u8g2.setDrawColor(2); // 设置颜色,0透显,1实显,2XOR
    u8g2.drawBox(43, 0, 43, 12);
    u8g2.setDrawColor(0); //
    u8g2.drawStr(44, 9, "Charge");
    u8g2.setDrawColor(1);
    // u8g2.drawStr(47, 28, "18.5V");
    // u8g2.drawStr(47, 46, "1.2A");
    // u8g2.drawStr(47, 64, "12.5W");
    u8g2.setCursor(47, 28);
    u8g2.print(oled.Charge_V, 1);
    u8g2.print("V");
    u8g2.setCursor(47, 46);
    u8g2.print(oled.Charge_I, 1);
    u8g2.print("A");
    u8g2.setCursor(47, 64);
    u8g2.print(oled.Charge_P, 1);
    u8g2.print("W");
    // u8g2.sendBuffer();

    // PCB温度
    u8g2.setCursor(92, 10);
    u8g2.print(oled.temp, 1);
    u8g2.print("C");

    /*充电状态*/
    if (charger_state == on)
    {
        u8g2.drawStr(92, 28, "On");
    }
    else if (charger_state == off)
    {
        u8g2.drawStr(92, 28, "off");
    }
    else if (charger_state == bulk)
    {
        u8g2.drawStr(92, 28, "bulk");
    }
    else if (charger_state == bat_float)
    {
        u8g2.drawStr(92, 28, "Float");
    }

    // u8g2.drawStr(92, 28, "Bulk"); // 充电状态
    // u8g2.drawStr(95, 46, "off");  // 负载输出状态
    /*电量*/
    pct = 100.0 * (data.Charge_V - 11.3) / (12.7 - 11.3);
    pct = constrain(pct, 0, 100);
    // u8g2.drawStr(95, 64, "96%"); // 充电效率
    u8g2.setCursor(95, 64);
    u8g2.print(pct);
    u8g2.print("%");

    /*PWM*/
    // u8g2.setCursor(95, 64);
    // u8g2.print(PWM*100/2047);

    u8g2.sendBuffer();
}